﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace dasBlog.Storage.Configuration
{
    public sealed class StorageBusSection : ConfigurationSection
    {
        // Fields
        private static ConfigurationPropertyCollection _properties = new ConfigurationPropertyCollection();
        private static readonly ConfigurationProperty _propScopes = new ConfigurationProperty(null, typeof(ScopeElementCollection), null, ConfigurationPropertyOptions.IsDefaultCollection);

        // Methods
        static StorageBusSection()
        {
            _properties.Add(_propScopes);
        }

        // Properties
        protected override ConfigurationPropertyCollection Properties
        {
            get
            {
                return _properties;
            }
        }

        [ConfigurationProperty("", IsDefaultCollection = true)]
        public ScopeElementCollection Scopes
        {
            get
            {
                return (ScopeElementCollection)base[_propScopes];
            }
        }
    }

    public sealed class ScopeElementCollection : ConfigurationElementCollection
    {
        // Methods
        public void Add(ScopeElement element)
        {
            this.BaseAdd(element);
        }

        public void Clear()
        {
            base.BaseClear();
        }

        protected override ConfigurationElement CreateNewElement()
        {
            return new ScopeElement();
        }

        public ScopeElement Get(string elementKey)
        {
            return (ScopeElement)base.BaseGet(elementKey);
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ScopeElement)element).Key;
        }

        public void Remove(ScopeElement element)
        {
            base.BaseRemove(this.GetElementKey(element));
        }

        // Properties
        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.BasicMap;
            }
        }

        protected override string ElementName
        {
            get
            {
                return "scope";
            }
        }
    }

    public sealed class ScopeElement : ConfigurationElement
    {
        // Fields
        private static ConfigurationPropertyCollection _properties =
            new ConfigurationPropertyCollection();
        private static readonly ConfigurationProperty _propName =
            new ConfigurationProperty("name", typeof(string), "",
                ConfigurationPropertyOptions.IsKey | ConfigurationPropertyOptions.IsRequired);
        private static readonly ConfigurationProperty _propUriLayout =
            new ConfigurationProperty("uriLayout", typeof(string), "",
                ConfigurationPropertyOptions.IsRequired);
        
        // Methods
        static ScopeElement()
        {
            _properties.Add(_propName);
            _properties.Add(_propUriLayout);
        }

        public ScopeElement()
        {
        }

        public ScopeElement(string name, string uriLayout)
            : this()
        {
            this.Name = name;
            this.UriLayout = uriLayout;
        }

        public override bool Equals(object StorageBus)
        {
            ScopeElement element = StorageBus as ScopeElement;
            if ((element != null) && base.Equals(StorageBus))
            {
                return object.Equals(this.Name, element.Name);
            }
            return false;
        }

        public override int GetHashCode()
        {
            return (base.GetHashCode() ^ this.UriLayout.GetHashCode());
        }

        // Properties
        internal string Key
        {
            get
            {
                return this.Name;
            }
        }

        [ConfigurationProperty("name", IsRequired = true, IsKey = true, DefaultValue = "")]
        public string Name
        {
            get
            {
                return (string)base[_propName];
            }
            set
            {
                base[_propName] = value;
            }
        }

        protected override ConfigurationPropertyCollection Properties
        {
            get
            {
                return _properties;
            }
        }

        [ConfigurationProperty("uriLayout", IsRequired = true, DefaultValue = null)]
        public string UriLayout
        {
            get
            {
                return (string)base[_propUriLayout];
            }
            set
            {
                base[_propUriLayout] = value;
            }
        }
    }
}
